package jmine.tec.web.wicket.component.command.img;

import java.io.Serializable;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.Link;

/**
 * Implementação base de {@link ImageCommand} que utiliza links convecionais (sem ajax).
 * 
 * @author Rafael Volpato
 * @date Dec 8, 2011
 */
public abstract class AbstractImageCommand implements ImageCommand {

    /**
     * Executa a ação do comando.
     * 
     * @param commandParam parametro para o comando
     * @return {@link Page} para onde deve ser direcionado após executar a ação (pode ser <code>null</code>).
     */
    protected abstract Page execute(Serializable commandParam);

    /**
     * Cria uma nova instancia de um componente do tipo {@link Link}.
     * 
     * @param id id que deve ser utilizado no link
     * @param commandParam parametro do comando a ser executado
     * @return uma nova instancia de um componente do tipo {@link Link}
     */
    public AbstractLink createLinkComponent(final String id, final Serializable commandParam) {
        return new Link<Void>(id) {
            @Override
            public void onClick() {
                Page destination = AbstractImageCommand.this.execute(commandParam);
                if (destination != null) {
                    this.setResponsePage(destination);
                }
            }
        };
    }

    /**
     * {@inheritDoc}
     */
    public String getMarkupIdPrefix() {
        return StringUtils.substringBefore(this.getImage().getName(), ".");
    }
}
